perm filename FILNAM.SAI[VIS,HPM]1 blob
sn#263816 filedate 1977-02-10 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 ENTRY DEFFIL,FILDEF,DEVPRS,FILPRS,PRSFIL
C00008 ENDMK
C⊗;
ENTRY DEFFIL,FILDEF,DEVPRS,FILPRS,PRSFIL;
BEGIN "FILNAM"
OWN STRING DV,FN1,FN2,PRJ,PRG;
COMMENT FOR PARSING FILSPECS BETTER THAN THE SAIL SCANNER. DEFFIL ALLOWS
DEFAULT DEV:FN1.FN2[PRJ,PRG] TO BE SET. FILDEF RETURNS CURRENT
DEFAULTS. PRSFIL PARSES A COMPOUND FILE SPEC AND SETS DEFAULTS
FROM DEFINED PORTIONS, FILPRS RETURNS A COMPOUND FILSPEC;
PROCEDURE DEFINIT;
IF LENGTH(PRG)=0∧LENGTH(PRJ)=0∧LENGTH(DV)=0 THEN
BEGIN
INTEGER PPN;
PPN←CALL(0,"DSKPPN");
DV←"DSK";
PRJ←CVXSTR(PPN)[1 TO 3];
PRG←CVXSTR(PPN)[4 TO 6];
END;
INTERNAL PROCEDURE DEFFIL(STRING DVD,FN1D,FN2D,PRJD,PRGD);
BEGIN
DEFINIT;
IF LENGTH(DVD)>0 THEN DV←DVD;
IF LENGTH(FN1D)>0 THEN FN1←FN1D;
IF LENGTH(FN2D)>0 THEN FN2←FN2D;
IF LENGTH(PRJD)>0 THEN PRJ←PRJD;
IF LENGTH(PRGD)>0 THEN PRG←PRGD;
END;
INTERNAL PROCEDURE FILDEF(REFERENCE STRING DVD,FN1D,FN2D,PRJD,PRGD);
BEGIN
DEFINIT;
DVD←DV;
FN1D←FN1;
FN2D←FN2;
PRJD←PRJ;
PRGD←PRG;
END;
INTERNAL STRING PROCEDURE DEVPRS; RETURN(DV);
INTERNAL STRING PROCEDURE FILPRS;
BEGIN
DEFINIT;
RETURN(FN1&"."&FN2&
(IF LENGTH(PRJ)>0∧LENGTH(PRG)>0 THEN "["&PRJ&","&PRG&"]" ELSE ""));
END;
INTERNAL PROCEDURE PRSFIL(STRING FILSPEC);
BEGIN
BOOLEAN LITR;
STRING S,T;
INTEGER I,LCNT;
DEFINIT;
LITR←FALSE;
S←FILSPEC;
T←"";
WHILE LENGTH(S)>0 ∧ (LITR ∨ S[1 TO 1]≠":") DO
IF S[1 TO 1]="↓" THEN
BEGIN LITR←¬LITR; S←S[2 TO ∞] END
ELSE IF (¬LITR)∧(S[1 TO 1]=" "∨S[1 TO 1]=" "∨S[1 TO 1]="]"∨S[1 TO 1]=",")
THEN S←S[2 TO ∞]
ELSE T←T&LOP(S);
IF S[1 TO 1]=":" THEN
BEGIN
DV←T;
S←S[2 TO ∞];
FILSPEC←S;
END
ELSE S←FILSPEC;
T←""; LCNT←0;
WHILE LENGTH(S)>0 ∧ (LITR ∨ (S[1 TO 1]≠"." ∧ S[1 TO 1]≠"[")) DO
IF S[1 TO 1]="↓" THEN
BEGIN LITR←¬LITR; S←S[2 TO ∞]; LCNT←LCNT+1; END
ELSE IF (¬LITR)∧(S[1 TO 1]=" "∨S[1 TO 1]=" "∨S[1 TO 1]="]"∨S[1 TO 1]=",")
THEN S←S[2 TO ∞]
ELSE T←T&LOP(S);
IF LENGTH(T)>0 ∨ LCNT>0 THEN FN1←T;
IF S[1 TO 1]="." THEN
BEGIN
S←S[2 TO ∞];
T←"";
WHILE LENGTH(S)>0 ∧ (LITR ∨ S[1 TO 1]≠"[") DO
IF S[1 TO 1]="↓" THEN
BEGIN LITR←¬LITR; S←S[2 TO ∞]; END
ELSE IF (¬LITR)∧(S[1 TO 1]=" "∨S[1 TO 1]=" "∨S[1 TO 1]="]"∨S[1 TO 1]=",")
THEN S←S[2 TO ∞]
ELSE T←T&LOP(S);
FN2←T;
END;
IF S[1 TO 1]="[" THEN
BEGIN
S←S[2 TO ∞];
FILSPEC←S;
T←""; LCNT←0;
WHILE LENGTH(S)>0 ∧ (LITR ∨ (S[1 TO 1]≠"," ∧ S[1 TO 1]≠"]")) DO
IF S[1 TO 1]="↓" THEN
BEGIN LITR←¬LITR; S←S[2 TO ∞]; LCNT←LCNT+1; END
ELSE IF (¬LITR)∧(S[1 TO 1]=" "∨S[1 TO 1]=" ") THEN S←S[2 TO ∞]
ELSE T←T&LOP(S);
IF LENGTH(T)>0 ∨ LCNT>0 THEN PRJ←T;
END;
IF S[1 TO 1]="," THEN
BEGIN
S←S[2 TO ∞];
T←""; LCNT←0;
WHILE LENGTH(S)>0 ∧ (LITR ∨ S[1 TO 1]≠"]") DO
IF S[1 TO 1]="↓" THEN
BEGIN LITR←¬LITR; S←S[2 TO ∞]; LCNT←LCNT+1; END
ELSE IF (¬LITR)∧(S[1 TO 1]=" "∨S[1 TO 1]=" ") THEN S←S[2 TO ∞]
ELSE T←T&LOP(S);
IF LENGTH(T)>0 ∨ LCNT>0 THEN PRG←T;
END;
END;
END;